package com.gao;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @Author: suGar
 * @Date: 2022/10/13 15:57
 */
public class Generator {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/cloud?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
        String name = "root";
        String password = "root";

        FastAutoGenerator.create(url, name, password)
                // 全局配置
                .globalConfig((scanner, builder) ->
                                builder.author(scanner.apply("请输入作者名称？"))
                                        // 输出目录
                                        .outputDir(System.getProperty("user.dir") + "\\" + scanner.apply("请输入模块名？") + "\\src\\main\\java")
                                        // 覆盖已生成文件
                                        .fileOverride()
                                        // 禁止打开输出目录：默认 true
                                        .disableOpenDir()
                                        .enableSwagger()
                )
                // 包配置
                .packageConfig((scanner, builder) ->
                        builder.parent(scanner.apply("请输入包名？"))
                                // 自定义实体包名
                                .entity("pojo")
                )
                // 策略配置
                .strategyConfig((scanner, builder) ->
                        builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
//                                .addTablePrefix("s_")// 设置过滤表前缀
                                // 控制层配置
                                .controllerBuilder().enableRestStyle().enableHyphenStyle()
                                // 服务层配置
                                .serviceBuilder()
                                // 去除服务接口前的I前缀，%s表示实体类名：[实体类名 + Service]
//                                .formatServiceFileName("%sService")
                                // 实体层配置
                                .entityBuilder()
                                .enableLombok()
                                .enableRemoveIsPrefix()
                                .enableTableFieldAnnotation()
                                // 主键策略
                                .idType(IdType.ASSIGN_ID)
                                // 时间自动填充
                                .addTableFills(
                                        new Column("gmt_create", FieldFill.INSERT),
                                        new Column("gmt_modified", FieldFill.INSERT_UPDATE)
                                )
                                .addTableFills(new Column("gmt_create", FieldFill.INSERT))
                                .addTableFills(new Column("gmt_modified", FieldFill.INSERT_UPDATE))
                                // 乐观锁
                                .versionColumnName("version")
                                .versionPropertyName("version")
                                // 逻辑删除
                                .logicDeleteColumnName("deleted")
                                .logicDeletePropertyName("deleted")
                                .mapperBuilder()
                                .superClass(BaseMapper.class)
                                .formatMapperFileName("%sMapper")
                                .enableMapperAnnotation()
                                .formatXmlFileName("%sMapper")
                                .build()
                )
//                    模板引擎配置，默认 Velocity 可选模板引擎 Beetl 或 Freemarker
//                .templateEngine(new BeetlTemplateEngine())
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

}
